#include "StdAfx.h"
#include "Utilidades.h"

bool Utilidades::sonStringsIguales(string primero, string segundo){  //metodo de comparacion NO case sensitive

string copia1,copia2;

copia1 = primero;
copia2 = segundo;

std::transform(copia1.begin(), copia1.end(), copia1.begin(), ::tolower); 
std::transform(copia2.begin(), copia2.end(), copia2.begin(), ::tolower);

if (copia1.compare(copia2) == 0) return true;
else return false;

}


int  Utilidades::posXrelPantalla(int anchoScreen, double posX){

	double result = posX - (-anchoScreen/2);

	return ceil (result);

}

int  Utilidades::posYrelPantalla(int altoScreen, double posY){

	double result = posY - (altoScreen/2);

	return ceil (abs(result));
}

//el angulo recibido es en grados
Punto* Utilidades::getComponentesCartesianos(double angulo){

	Punto* unpunto = new Punto();

	double angRad = Utilidades::toRadianes(angulo);

	unpunto->setPosX(cos(angRad));
	unpunto->setPosY(sin(angRad));
	return unpunto;
}

//devuelve los valores en grados
double Utilidades::getAngulo(Punto* componenteCartesiano){

	double angrad = atan2(componenteCartesiano->getPosY(),componenteCartesiano->getPosX());

	double aux = Utilidades::toGrados(angrad);
	
	if( aux > 360) aux -= 360;

	if (aux < 0) return 360 + aux;
	else return aux;

}


/**
devuelve 1 si esta en el primer cuadrante, 2 si esta en el segundo
y asi sucesivamente
*/
int Utilidades::cuadrante(double angulo){

	if (angulo > 360) angulo -= 360;

	if ( (angulo >= 0) && (angulo <= 90))return 1;
	if ( (angulo > 90) && (angulo < 180))return 2;
	if ( (angulo >= 180) && (angulo < 270))return 3;
	if ( (angulo >= 270) && (angulo < 360))return 4;

}


double Utilidades::toRadianes(double grados){

	double PiSobre180 = 0.017453292;

	return grados * PiSobre180;

}
	

double Utilidades::toGrados(double radianes){


	double cientSobrePi = 57.29577951;

	return radianes * cientSobrePi;

}

//devuelve el vector director de la recta A->B
Punto* Utilidades::vectorDirector(Punto* A, Punto* B){

	Punto* result = new Punto();

	double x= B->getPosX() - A->getPosX();
	double y= B->getPosY() - A->getPosY();

	result->setPosX(x);
	result->setPosY(y);

	return result;

}


double Utilidades::anguloEntreVectoresDirectores(Punto* vec1, Punto* vec2){


	double u1 = vec1->getPosX();
	double u2 = vec1->getPosY();
	double v1 = vec2->getPosX();
	double v2 = vec2->getPosY();


	double numerador= (u1 * v1) + (u2 * v2);

	numerador = abs(numerador);

	double denom1= sqrt( (u1*u1)+(u2*u2) );

	double denom2= sqrt( (v1*v1)+(v2*v2) );

	double denomFinal = denom1 * denom2;

	double result = acos((numerador/denomFinal));

	return Utilidades::toGrados(result);

}
